import * as XLSX from 'xlsx';
import { saveAs } from 'file-saver';

// 定义导出配置接口
interface ExportConfig {
  // 表格数据
  data: any[];
  // 导出字段配置
  fields: {
    // 字段名
    field: string;
    // 导出的中文标题
    title: string;
    // 自定义格式化函数
    formatter?: (value: any) => any;
  }[];
  // 文件名
  fileName: string;
  // 工作表名称
  sheetName?: string;
}

/**
 * 导出表格数据到Excel
 * @param config 导出配置
 */
export const exportTableToExcel = (config: ExportConfig) => {
  const {
    data,
    fields,
    fileName,
    sheetName = 'Sheet1'
  } = config;

  try {
    // 准备导出数据
    const exportData = data.map(item => {
      const row: Record<string, any> = {};
      fields.forEach(({ field, title, formatter }) => {
        // 如果存在格式化函数，使用格式化函数处理数据
        const value = formatter ? formatter(item[field]) : item[field];
        row[title] = value ?? '';
      });
      return row;
    });

    // 创建工作簿
    const worksheet = XLSX.utils.json_to_sheet(exportData);
    const workbook = XLSX.utils.book_new();
    XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);

    // 生成Excel文件
    const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
    const blob = new Blob([excelBuffer], { 
      type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
    });
    
    // 保存文件
    saveAs(blob, `${fileName}_${new Date().toLocaleDateString()}.xlsx`);
  } catch (error) {
    console.error('导出Excel失败:', error);
    throw new Error('导出Excel失败');
  }
};

/**
 * 常用的格式化函数
 */
export const formatters = {
  // 日期格式化
  formatDate: (value: string | Date) => {
    if (!value) return '';
    const date = new Date(value);
    return date.toLocaleDateString();
  },
  
  // 状态格式化
  formatStatus: (value: number) => {
    const statusMap: Record<number, string> = {
      1: '启用',
      0: '禁用'
    };
    return statusMap[value] || '';
  },
  
  // 金额格式化
  formatAmount: (value: number) => {
    if (!value) return '0.00';
    return value.toFixed(2);
  }
}; 